#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "Tren.h"

GLfloat spinX = 0.0, spinY = 0.0, spinZ = 0.0;
float BOX_HEIGHT = 30.0f; //The height of the box off of the ground
static const GLfloat TAMPantalla = 300.0;

int escena=0;

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    // El último búffer maneja la transparencia
    glLoadIdentity();
    glRotatef(spinX, 1, 0, 0);
    glRotatef(spinY, 0, 1, 0);
    glRotatef(spinZ, 0, 0, 1);

    if(escena==1){
        gluLookAt(1, 50, 1, 0, 0, 0, 0, 1, 0);
        
    }else if(escena==2){
        gluLookAt(45.0, 10.0, 30.0, 
                -15.0, 4.0, 245.0, 
                0.0, 1.0, 0.0);
        glScalef(2.0, 2.0, 2.0);
    }
    glPushMatrix();
    glTranslatef(0, BOX_HEIGHT, 0);
    Tren t;
    t.generaTren();
    //Aquí debe llamar a los objetos 
    glPopMatrix();

    usleep(10);
    glutSwapBuffers();
}

void init(void) {
    glClearColor(0.0, 0.0, 0.0, 0.0); //Colores para iniciar la ventana (Fondo)
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Maneja la transparencia
}

void mouseMotion(int x, int y) {
    spinX = x;
    spinY = y;
}

void spinDisplay() {
    glutPostRedisplay();
}

void teclado(unsigned char key, int x, int y){
    switch(key){
        case '1':{
            escena=1;
            spinX=0;
            spinY=0;
        }break;
        case '2':{
            escena=2;
            spinX=0;
            spinY=0;
        }break;
    }
}

void mouse(int button, int state, int x, int y) {
    switch (button) {
        case GLUT_LEFT_BUTTON:
        {
            if (state == GLUT_DOWN) {
                glutIdleFunc(spinDisplay);
            }
        }
            break;
        case GLUT_RIGHT_BUTTON:
        {
            if (state == GLUT_DOWN) {
                glutIdleFunc(NULL);
            }
        }
            break;
    }
}

void reshape(int w, int h) {
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrtho(TAMPantalla*-1, TAMPantalla, TAMPantalla*-1, TAMPantalla, TAMPantalla*-1, TAMPantalla); //Izq, Der, Abajo, Arriba, Cerca, lejos

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    gluPerspective(45.0, ((float) w / (float) h), 100.0, 100.0);
}

int main(int argc, char** argv) {
    glutInit(&argc, argv); //Inicializa la librería GLUT y negocia una sesión
    //con el sistema de ventanas
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); //Activa el modo inicial de despliegue
    glutInitWindowSize(650, 500); //Tamaño de la ventana 500 x 500
    glutInitWindowPosition(100, 100); //Posición de la ventana en la pantalla
    glutCreateWindow("Tren"); //Crea la ventana y le pone la etiqueta
    init(); //Ejecuta el método "init"
    glutDisplayFunc(display); //Ejecuta el método "display" 
    glutReshapeFunc(reshape); //Ejecuta el método "reshape"
    glutKeyboardFunc(teclado);
    glutMouseFunc(mouse);
    glutMotionFunc(mouseMotion);
    glutMainLoop(); //Repite el main indefinidamente (¡Animación!)
    return 0;
}